package com.hd123.rumba.gwt.base.client;

import java.util.HashMap;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.hd123.rumba.gwt.base.client.biz.BSimpleBasic;
import com.hd123.rumba.gwt.base.client.exception.ClientBizException;
import com.hd123.rumba.gwt.widget.client.Util;

public abstract class EntryPointBase implements EntryPoint {

  public void onModuleLoad() {
    if (getRemoteService() == null)
      return;

    Util.showProgressInfo("正在加载...");
    getRemoteService().getCurrentSession(buildParams(), new AsyncCallback() {

      public void onFailure(Throwable caught) {
        Util.hideProgressInfo();
        Util.showErrorDialog(caught.getMessage());
      }

      public void onSuccess(Object result) {
        Util.hideProgressInfo();
        session = (Session) result;

        onSessionLoad();
      }
    });

  }

  /**
   * 取得当前对应的远程服务。
   * 
   * @return
   */
  protected abstract RBRemoteServiceAsync getRemoteService();

  /** 当前会话信息 */
  private Session session = null;

  /**
   * 当会话{@link #session}被载入的时候被调用。提供给子类重写该方法。
   * 
   */
  protected void onSessionLoad() {
    // Do Nothing
  };

  /**
   * 取得当前会话信息。
   * 
   * @return
   */
  public Session getCurrentSession() {
    return session;
  }

  /**
   * 取得当前登录用户。
   * 
   * @return
   * @throws ClientBizException
   */
  public BSimpleBasic getCurrentUser() throws ClientBizException {
    if (session == null)
      throw new ClientBizException("无法取得当前会话信息。");
    return session.getUser();
  }

  /**
   * 取得当前登录域。
   * 
   * @return
   * @throws ClientBizException
   */
  public BSimpleBasic getCurrentDomain() throws ClientBizException {
    if (session == null)
      throw new ClientBizException("无法取得当前会话信息。");
    return session.getDomain();
  }

  /**
   * 取得当前登录组织。
   * 
   * @return
   * @throws ClientBizException
   */
  public BSimpleBasic getCurrentOrganization() throws ClientBizException {
    if (session == null)
      throw new ClientBizException("无法取得当前会话信息。");
    return session.getOrganization();
  }

  /** URL参数列表 */
  private HashMap parameters = null;

  /**
   * 获得URL的参数部分，即问号后面的部分
   * 
   * @return
   */
  private native String getQuery() /*-{
     return $wnd.location.search.substr(1)
     }-*/;

  /**
   * 获得URL参数列表
   * 
   * @return
   */
  public HashMap getParameters() {
    if (parameters == null) {
      parameters = new HashMap();

      String query = getQuery();
      if (query.equals(""))
        return parameters;

      String[] queryElements = query.split("&");
      for (int i = 0; i < queryElements.length; i++) {
        String[] kv = queryElements[i].split("=");
        parameters.put(kv[0], kv[1]);
      }
    }

    return parameters;
  }

  /**
   * 查询URL参数列表
   * 
   * @param key
   * @return key对应的value
   */
  public String getParameterValue(String key) {
    String result = (String) getParameters().get(key);
    return result == null ? "" : result;
  }

  /**
   * URL中start参数的值
   * 
   * @return
   */
  public String getStartNode() {
    return getParameterValue("start");
  }

  /**
   * 构造模块入口参数，由继承类覆盖。
   * 
   * @return
   */
  protected HashMap buildParams() {
    // do nothing
    return null;
  }

}
